package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.product.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

/**
 * @author 李旭
 * @date 2021/11/19 15:36
 * @Description:
 */
@Service
public class TestServiceImpl implements TestService {


    //测试
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     *   Redis:   K:num  V:0
     *          ++ 操作
     *
     *
     *  5000次  ==  并发 100    每次发请求100个请求   发50次   最终结果是5000
     *
     *   不见不散的锁
     *
     *  apache  ab 软件
     *
     */
/*    @Override    本地锁测试
    public synchronized void testLock() {
        Integer num = (Integer) redisTemplate.opsForValue().get("num");
        num++;
        redisTemplate.opsForValue().set("num",num);

    }*/
    @Override    //分布式锁测试
    public void testLock() {

        //1:加锁    java代码 ： setIfAbsent   redis:setnx
        Boolean isLock = redisTemplate.opsForValue().setIfAbsent("state", 10000);
        //返回值：true 表示 设置成功（不存在此Key）    false:表示设置失败（存在此Key）
        if(isLock){
            //获取锁成功
            Integer num = (Integer) redisTemplate.opsForValue().get("num");
            num++;
            redisTemplate.opsForValue().set("num",num);

            //解锁  将存在的Key删除掉
            redisTemplate.delete("state");

        }else{
            //获取锁失败
            //重新获取
            testLock();
        }

    }
}
